const Set = require('../template')

function testSetAdvancedMethods() {
  // 1. setDeep 深度限制设置
  console.log(
    "1. setDeep 深度限制设置:",
    (() => {
      const obj = { a: { b: { c: 1 } } }
      // 深度限制为2，允许设置a.b.d（深度2），禁止设置a.b.c.d（深度3）
      Set.setDeep(obj, 'a.b.d', 2, 2)
      const result1 = obj.a.b.d === 2

      try {
        Set.setDeep(obj, 'a.b.c.d', 3, 2)
        return result1 && obj.a.b.c.d === undefined
      } catch (e) {
        return result1
      }
    })()
  )

  // 2. setWithCondition 条件设置（满足条件才设置）
  console.log(
    "2. setWithCondition 条件设置（满足条件才设置）:",
    (() => {
      const obj = { a: 10 }
      // 条件：值大于10才设置
      Set.setWithCondition(obj, 'a', 15, (val) => val > 10)
      const result1 = obj.a === 15

      // 条件：值大于20才设置（不满足）
      Set.setWithCondition(obj, 'a', 25, (val) => val > 20)
      const result2 = obj.a === 15

      return result1 && result2
    })()
  )

  // 3. setWithType 类型检查设置
  console.log(
    "3. setWithType 类型检查设置:",
    (() => {
      const obj = {}
      // 要求类型为number
      Set.setWithType(obj, 'age', 30, 'number')
      const result1 = obj.age === 30

      // 类型不匹配（string≠number）
      try {
        Set.setWithType(obj, 'age', '30', 'number')
        return result1 && obj.age === 30
      } catch (e) {
        return result1
      }
    })()
  )

  // 4. setWithTransform 转换后设置
  console.log(
    "4. setWithTransform 转换后设置:",
    (() => {
      const obj = {}
      // 转换函数：字符串转大写
      Set.setWithTransform(obj, 'name', 'alice', (val) => val.toUpperCase())
      return obj.name === 'ALICE'
    })()
  )

  // 5. setWithValidation 验证后设置
  console.log(
    "5. setWithValidation 验证后设置:",
    (() => {
      const obj = {}
      // 验证规则：字符串长度≥3
      const schema = { type: 'string', minLength: 3 }
      Set.setWithValidation(obj, 'username', 'bob', schema)
      const result1 = obj.username === 'bob'

      // 验证失败（长度不足）
      try {
        Set.setWithValidation(obj, 'username', 'bo', schema)
        return result1 && obj.username === 'bob'
      } catch (e) {
        return result1
      }
    })()
  )

  // 6. setMultiple 多路径批量设置
  console.log(
    "6. setMultiple 多路径批量设置:",
    (() => {
      const obj = {}
      const paths = ['a', 'b.c', 'd[0]']
      Set.setMultiple(obj, paths, 10)
      return obj.a === 10 && obj.b.c === 10 && obj.d[0] === 10
    })()
  )

  // 7. setWithStats 带统计信息的设置
  console.log(
    "7. setWithStats 带统计信息的设置:",
    (() => {
      const obj = { a: 1 }
      const stats = Set.setWithStats(obj, 'a.b', 2)
      return stats.success === true && stats.path === 'a.b' && stats.value === 2 && obj.a.b === 2
    })()
  )
}

// 执行测试
console.log("=== Set 高级方法测试 ===")
testSetAdvancedMethods()
console.log("=== Set 高级方法测试完成 ===")
